package com.shop.cereshop.admin.dao.admin;

import com.shop.cereshop.admin.param.admin.StatsAmountByDay;
import com.shop.cereshop.admin.param.admin.StatsByDay;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

@Mapper
public interface AdminDAO {

    List<StatsByDay> selectUserCount(@Param("startTime") String startTime, @Param("endTime") String endTime);

    List<StatsByDay> selectVisitCount(@Param("startTime") String startTime, @Param("endTime") String endTime);

    List<StatsByDay> selectVisitUserCount(@Param("startTime") String startTime, @Param("endTime") String endTime);

    List<StatsByDay> selectShopCount(@Param("startTime") String startTime, @Param("endTime") String endTime);
    
    /**
     * 查询用户总数
     * @return 返回用户总数，Integer类型
     */
    Integer selectTotalUserCount();
    
    /**
     * 查询店铺的总数量
     * @return 返回店铺的总数量，返回类型为Integer
     */
    Integer selectTotalShopCount();
    
    /**
     * 查询指定时间段内新增用户数量
     * @param startTime 开始时间，格式为字符串
     * @return 返回指定时间段内新增用户的数量，返回类型为Integer
     */
    Integer selectYearNewUserCount(@Param("startTime") String startTime);
    
    /**
     * 查询指定年份内新开店铺的数量
     * @param startTime 开始时间，用于筛选新开店铺的时间范围
     * @param endTime 结束时间，用于筛选新开店铺的时间范围
     * @return 返回符合条件的新开店铺数量
     */
    Integer selectYearNewShopCount(@Param("startTime") String startTime, @Param("endTime") String endTime);
    
    /**
     * 合并查询：同时获取商家总数和指定时间段内新增商家数
     * @param startTime 开始时间，用于筛选新增商家的时间范围
     * @param endTime 结束时间，用于筛选新增商家的时间范围
     * @return 返回包含商家总数和新增商家数的Map
     */
    @MapKey("statsType")
    Map<String, Integer> selectShopStats(@Param("startTime") String startTime, @Param("endTime") String endTime);
    
    /**
     * 合并查询：同时获取用户总数和指定时间段内新增用户数
     * @param startTime 开始时间，用于筛选新增用户的时间范围
     * @param endTime 结束时间，用于筛选新增用户的时间范围
     * @return 返回包含用户总数和新增用户数的Map
     */
    @MapKey("statsType")
    Map<String, Integer> selectUserStats(@Param("startTime") String startTime, @Param("endTime") String endTime);
    
    /**
     * 合并查询：同时获取用户总数和指定时间段内新增用户数，并支持按区域筛选
     * @param startTime 开始时间，用于筛选新增用户的时间范围
     * @param endTime 结束时间，用于筛选新增用户的时间范围
     * @param province 省份，用于按区域筛选
     * @param city 城市，用于按区域筛选
     * @return 返回包含用户总数和新增用户数的Map
     */
    @MapKey("statsType")
    Map<String, Integer> selectUserStatsByRegion(@Param("startTime") String startTime, @Param("endTime") String endTime, 
                                                @Param("province") String province, @Param("city") String city);
    
    /**
     * 合并查询：同时获取商家总数和指定时间段内新增商家数，并支持按区域筛选
     * @param startTime 开始时间，用于筛选新增商家的时间范围
     * @param endTime 结束时间，用于筛选新增商家的时间范围
     * @param province 省份，用于按区域筛选
     * @param city 城市，用于按区域筛选
     * @return 返回包含商家总数和新增商家数的Map
     */
    @MapKey("statsType")
    Map<String, Integer> selectShopStatsByRegion(@Param("startTime") String startTime, @Param("endTime") String endTime, 
                                                @Param("province") String province, @Param("city") String city);

    List<StatsAmountByDay> selectOrderAmountList(@Param("startTime") String startTime, @Param("endTime") String endTime);

    List<StatsByDay> selectOrderCountList(@Param("startTime") String startTime, @Param("endTime") String endTime);

    Integer selectOrderCountSum(@Param("startTime") String startTime, @Param("endTime") String endTime);

    List<StatsByDay> selectPayUserCountList(@Param("startTime") String startTime, @Param("endTime") String endTime);

    Integer selectPayUserCountSum(@Param("startTime") String startTime, @Param("endTime") String endTime);
}
